package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.school.sports.entity.OperationLog;

import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 操作日志服务接口
 */
public interface OperationLogService extends IService<OperationLog> {

    /**
     * 分页查询操作日志
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @param operationLog 查询条件
     * @return 分页结果
     */
    IPage<OperationLog> getOperationLogPage(Integer currentPage, Integer pageSize, OperationLog operationLog);

    /**
     * 记录操作日志
     * @param operationLog 操作日志信息
     * @return 记录结果
     */
    boolean saveOperationLog(OperationLog operationLog);

    /**
     * 根据用户ID查询操作日志
     * @param userId 用户ID
     * @param limit 查询条数限制
     * @return 操作日志列表
     */
    List<OperationLog> getOperationLogsByUserId(Long userId, Integer limit);

    /**
     * 根据操作类型查询操作日志
     * @param operationType 操作类型
     * @param limit 查询条数限制
     * @return 操作日志列表
     */
    List<OperationLog> getOperationLogsByType(String operationType, Integer limit);

    /**
     * 根据时间范围查询操作日志
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作日志列表
     */
    List<OperationLog> getOperationLogsByTimeRange(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 统计各类型操作日志数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    Map<String, Long> countByOperationType(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 统计用户操作次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param topN 统计前N名
     * @return 统计结果
     */
    List<Map<String, Object>> countByUserId(LocalDateTime startTime, LocalDateTime endTime, Integer topN);

    /**
     * 统计每日操作数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<Map<String, Object>> countByDate(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 统计失败操作数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    Long countFailedOperations(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 导出操作日志到Excel
     * @param operationLog 查询条件
     * @param response HTTP响应对象
     */
    void exportOperationLogs(OperationLog operationLog, HttpServletResponse response);

    /**
     * 批量删除操作日志
     * @param ids 日志ID列表
     * @return 删除结果
     */
    boolean batchDeleteLogs(List<Long> ids);

    /**
     * 清理指定时间之前的日志
     * @param beforeTime 时间点
     * @return 清理数量
     */
    Integer cleanLogsBeforeTime(LocalDateTime beforeTime);

    /**
     * 获取最近的操作日志
     * @param limit 查询条数
     * @return 操作日志列表
     */
    List<OperationLog> getRecentOperationLogs(Integer limit);

    /**
     * 根据IP地址查询操作日志
     * @param ipAddress IP地址
     * @param limit 查询条数限制
     * @return 操作日志列表
     */
    List<OperationLog> getOperationLogsByIp(String ipAddress, Integer limit);

    /**
     * 检查异常操作（频繁操作、异常IP等）
     * @param timeWindow 时间窗口（分钟）
     * @param threshold 阈值
     * @return 异常操作列表
     */
    List<Map<String, Object>> checkAbnormalOperations(Integer timeWindow, Integer threshold);
}